using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._HeliportObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>FAA 2C</para>
    /// <para>Generates an Obstruction Identification Surface (OIS) for helipads based on specifications from FAA Advisory Circular 150/5390-2C.</para>
    /// <para>根据 FAA 咨询通告 150/5390-2C 中的规范为直升机停机坪生成障碍物识别面 （OIS）。</para>
    /// </summary>    
    [DisplayName("FAA 2C")]
    public class FAA2C : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public FAA2C()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_fato_features">
        /// <para>Input FATO Features</para>
        /// <para>The input Final Approach and Takeoff (FATO) features.</para>
        /// <para>输入最终进近和起飞 （FATO） 功能。</para>
        /// </param>
        /// <param name="_target_ois_features">
        /// <para>Target OIS Features</para>
        /// <para>The target polygon or multipatch feature layer containing the Obstruction Identification Surfaces (OIS).</para>
        /// <para>包含障碍物识别面 （OIS） 的目标面或多面体要素图层。</para>
        /// </param>
        /// <param name="_surface_classification">
        /// <para>Surface  Classification</para>
        /// <para><xdoc>
        ///   <para>Specifies the classification type of the Final Approach and Takeoff (FATO) surface.</para>
        ///   <bulletList>
        ///     <bullet_item>Non Prior Permission Required (PPR) Facilities—Publically available helipads for general use by pilots. This is the default.</bullet_item><para/>
        ///     <bullet_item>Prior Permission Required (PPR) Facilities—A heliport used exclusively by the owner and individuals authorized by the owner to use the facility.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定最终进近和起飞 （FATO） 曲面的分类类型。</para>
        ///   <bulletList>
        ///     <bullet_item>无需事先许可 （PPR） 设施 - 供飞行员一般使用的公共直升机停机坪。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>需要事先许可 （PPR） 设施 - 由所有者和所有者授权使用该设施的个人专用的直升机场。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public FAA2C(object _input_fato_features, object _target_ois_features, _surface_classification_value _surface_classification)
        {
            this._input_fato_features = _input_fato_features;
            this._target_ois_features = _target_ois_features;
            this._surface_classification = _surface_classification;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "FAA 2C";

        public override string CallName => "aviation.FAA2C";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_input_fato_features, _target_ois_features, _surface_classification.GetGPValue(), _surface_shape.GetGPValue(), _approach_bearing, _in_flightpath_features, _helipad_elevation, _custom_json_file, _derived_outfeatureclass];

        /// <summary>
        /// <para>Input FATO Features</para>
        /// <para>The input Final Approach and Takeoff (FATO) features.</para>
        /// <para>输入最终进近和起飞 （FATO） 功能。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input FATO Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_fato_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The target polygon or multipatch feature layer containing the Obstruction Identification Surfaces (OIS).</para>
        /// <para>包含障碍物识别面 （OIS） 的目标面或多面体要素图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target_ois_features { get; set; }


        /// <summary>
        /// <para>Surface  Classification</para>
        /// <para><xdoc>
        ///   <para>Specifies the classification type of the Final Approach and Takeoff (FATO) surface.</para>
        ///   <bulletList>
        ///     <bullet_item>Non Prior Permission Required (PPR) Facilities—Publically available helipads for general use by pilots. This is the default.</bullet_item><para/>
        ///     <bullet_item>Prior Permission Required (PPR) Facilities—A heliport used exclusively by the owner and individuals authorized by the owner to use the facility.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定最终进近和起飞 （FATO） 曲面的分类类型。</para>
        ///   <bulletList>
        ///     <bullet_item>无需事先许可 （PPR） 设施 - 供飞行员一般使用的公共直升机停机坪。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>需要事先许可 （PPR） 设施 - 由所有者和所有者授权使用该设施的个人专用的直升机场。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface  Classification")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _surface_classification_value _surface_classification { get; set; }

        public enum _surface_classification_value
        {
            /// <summary>
            /// <para>Non Prior Permission Required (PPR) Facilities</para>
            /// <para>Non Prior Permission Required (PPR) Facilities—Publically available helipads for general use by pilots. This is the default.</para>
            /// <para>无需事先许可 （PPR） 设施 - 供飞行员一般使用的公共直升机停机坪。这是默认设置。</para>
            /// </summary>
            [Description("Non Prior Permission Required (PPR) Facilities")]
            [GPEnumValue("NON_PRIOR_PERMISSION_REQUIRED_FACILITIES")]
            _NON_PRIOR_PERMISSION_REQUIRED_FACILITIES,

            /// <summary>
            /// <para>Prior Permission Required (PPR) Facilities</para>
            /// <para>Prior Permission Required (PPR) Facilities—A heliport used exclusively by the owner and individuals authorized by the owner to use the facility.</para>
            /// <para>需要事先许可 （PPR） 设施 - 由所有者和所有者授权使用该设施的个人专用的直升机场。</para>
            /// </summary>
            [Description("Prior Permission Required (PPR) Facilities")]
            [GPEnumValue("PRIOR_PERMISSION_REQUIRED_FACILITIES")]
            _PRIOR_PERMISSION_REQUIRED_FACILITIES,

        }

        /// <summary>
        /// <para>Surface Shape</para>
        /// <para><xdoc>
        ///   <para>Specifies the shape of the take off or approach surface.</para>
        ///   <bulletList>
        ///     <bullet_item>Straight Surface—The take off or approach surface is straight. This is the default.</bullet_item><para/>
        ///     <bullet_item>Curved Surface—The take off or approach surface is curved.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定起飞或进近曲面的形状。</para>
        ///   <bulletList>
        ///     <bullet_item>直曲面 （Straight Surface） - 起飞或进近曲面是直的。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>曲面 （Curved Surface） - 起飞或进近曲面是曲面。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface Shape")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _surface_shape_value _surface_shape { get; set; } = _surface_shape_value._STRAIGHT_SURFACE;

        public enum _surface_shape_value
        {
            /// <summary>
            /// <para>Straight Surface</para>
            /// <para>Straight Surface—The take off or approach surface is straight. This is the default.</para>
            /// <para>直曲面 （Straight Surface） - 起飞或进近曲面是直的。这是默认设置。</para>
            /// </summary>
            [Description("Straight Surface")]
            [GPEnumValue("STRAIGHT_SURFACE")]
            _STRAIGHT_SURFACE,

            /// <summary>
            /// <para>Curved Surface</para>
            /// <para>Curved Surface—The take off or approach surface is curved.</para>
            /// <para>曲面 （Curved Surface） - 起飞或进近曲面是曲面。</para>
            /// </summary>
            [Description("Curved Surface")]
            [GPEnumValue("CURVED_SURFACE")]
            _CURVED_SURFACE,

        }

        /// <summary>
        /// <para>Approach Bearing</para>
        /// <para>The absolute bearing that an approaching aircraft will travel along the surface. A value of 0 will align the surface to true north. The default value is 0.</para>
        /// <para>接近的飞机将沿表面行驶的绝对方位。值为 0 会将表面对齐至正北。默认值为 0。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Approach Bearing")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _approach_bearing { get; set; } = 0;


        /// <summary>
        /// <para>Input Flight Path Features</para>
        /// <para>The polyline flight path features that the curved surface will follow.</para>
        /// <para>折线飞行路径特征将遵循曲面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Flight Path Features")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_flightpath_features { get; set; } = null;


        /// <summary>
        /// <para>Helipad Elevation</para>
        /// <para>The elevation of the highest point of the helipad. The value must be in the vertical coordinate system linear units of the target feature class. If no value is provided, the highest point of the Input FATO Features parameter value will be used. The default value is 0.</para>
        /// <para>直升机停机坪最高点的高度。该值必须采用目标要素类的垂直坐标系线性单位。如果未提供任何值，则将使用输入 FATO 特征参数值的最高点。默认值为 0。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Helipad Elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _helipad_elevation { get; set; } = 0;


        /// <summary>
        /// <para>Custom JSON File</para>
        /// <para>The import configuration file, in JSON format, that creates the custom OIS.</para>
        /// <para>导入配置文件，采用 JSON 格式，用于创建自定义 OIS。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Custom JSON File")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _custom_json_file { get; set; } = null;


        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_outfeatureclass { get; set; }


        public FAA2C SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}